package main

/*
#define _GNU_SOURCE
#include <sched.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <malloc.h>

// 在Go运行时启动之前执行的初始化函数，只有这样才能保证 setns 能正确执行...
// 该程序始终以子进程的方式运行，父进程会传递环境变量如下，以便可以正常运行
// _TINYDOCKER_EXEC_MODE="child"
// _TINYDOCKER_EXEC_CMD_COUNT="3"
// _TINYDOCKER_EXEC_CMD_0="bash"
// _TINYDOCKER_EXEC_CMD_1="-c"
// _TINYDOCKER_EXEC_CMD_2="echo hello"
// _TINYDOCKER_EXEC_PID="5908"
void __attribute__((constructor)) pre_init() {
    int fd;
    int i;
    int pid=29885;
    char nspath[1024];
    char* const container_args[] = {
        "/bin/bash",
        NULL
    };

	// 从父进程中获取相关的环境变量
	const char *exec_pid, *exec_mode, *exec_cmd_count;
	exec_pid = getenv("_TINYDOCKER_EXEC_PID");
	exec_mode = getenv("_TINYDOCKER_EXEC_MODE");
	exec_cmd_count = getenv("_TINYDOCKER_EXEC_CMD_COUNT");

	if (exec_mode != "child") {
		fprintf(stdout, "缺少环境变量 _TINYDOCKER_EXEC_MODE ，跳过该初始化");
		return;
	}
	if (exec_pid) {
		fprintf(stdout, "got mydocker_pid=%s\n", exec_pid);
	} else {
		fprintf(stdout, "缺少环境变量 _TINYDOCKER_EXEC_PID ，跳过该初始化");
		return;
	}
	if (exec_cmd_count == "") {
		fprintf(stdout, "缺少环境变量 _TINYDOCKER_EXEC_CMD_COUNT ，跳过该初始化");
		return;
	}

	printf("[Command]cmd param count: %s\n", exec_cmd_count);
    int index, argc;
    char *cmd_param;
    char **argv;

    argc = atoi(exec_cmd_count);
    cmd_param = malloc(32);// 分配32个字节，临时存储变量的环境变量标识
    printf("[Command]cmd param list: ");
    for(index=0; index++; index<argc) {
        sprintf(cmd_param, "_TINYDOCKER_EXEC_CMD_%d", index);
        argv[index] = getenv(cmd_param);
        printf("%s ", argv[index]);
    }
    printf("\n");

    // 注意调整命名空间的顺序，确保 mnt 最后设置，因为挂载命名空间会对文件系统视图产生影响
    // 否则的话，当进入挂载命名空间之后，如果再执行 open 其他的nspath的话，就会提示找不到，因为文件系统已经发生变化了。
    char *namespaceList[] = {"ipc", "uts", "pid", "net", "mnt"};
    for ( i = 0; i < 5; i++) {
        sprintf(nspath, "/proc/%d/ns/%s", pid, namespaceList[i]);
        //printf("进入ns:%s\n", nspath);
        fd = open(nspath, O_RDONLY);
        if (fd == -1) {
            perror("open");
            exit(EXIT_FAILURE);
        }
        //printf("fd:%d\n", fd);

        // 使用 setns 系统调用加入目标命名空间
        if (setns(fd, 0) == -1) {
            perror("setns");
            close(fd);
            exit(EXIT_FAILURE);
        }
        //printf("setns success\n");
        close(fd);
    }

        // 这里可以放置你想要在这个新命名空间环境中执行的代码
    // 此处是用 /bin/bash 起了一个新的shell, 以便可以手动查看
    execv(argv[0], argv);
    printf("出错了!!!\n");
    free(cmd_param);
    exit(0);
}
*/
import "C"

import (
	"fmt"
)

func main() {
	fmt.Println("Go runtime initialized!")
}
